package Socket;

import Modelo.Autito;
import Modelo.Escenario;
import Modelo.Figuras;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.LinkedList;
import java.util.LinkedList;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Cliente {

    public Socket socket;
    Integer puerto=5000;

    String serverHost =  "localhost";


     
    ObjectInputStream entrada;
    ObjectOutputStream salida;

    RunCliente runC;
    ClienteEscucha cliente_escucha;

    TeclaCliente tecla;
    Escenario escena;
    
    Vector<Figuras> vf;


public Cliente(String serverHost, Integer puerto, Integer jugador ) {

            tecla = new TeclaCliente();
            
            escena = new Escenario("Jugador " + jugador );
            
            escena.addFigurasEstaticas();
           
            escena.addExtras();

            escena.addAutos();
           
            escena.jframe.setVisible(true);
            
            
        
        try {
                socket = new Socket(serverHost,puerto);

             
            	
       	
                entrada = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));


                //recibo el id de mi autito
                tecla.idcliente  = (Integer)entrada.readObject();
                System.out.println ("Me dieron el autito " + tecla.idcliente);


               
                runC=new RunCliente(this);
                cliente_escucha = new ClienteEscucha(this);
                
        } catch (Exception ex) {System.out.println("Error: "+ex);}
            
            cliente_escucha.start(); //recibe vector de figuras para refrescar
            
}

public void cerrar(){
    //Cerrar los canales de entrada y salida que se hayan abierto
    try {
        salida.close();
        entrada.close();
        } catch (IOException ex) {System.out.println("Error al cerrar"); }
}



synchronized  public void setTecla(int t){

tecla.codtecla=t;
enviarTecla();
}


synchronized public void enviarTecla(){


        try {
            salida = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
            salida.writeObject(tecla);
            salida.flush();
        } catch (IOException ex) {
           // Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }

    //    System.out.println("Tecla a enviada: "+tecla);

	}

public void recibirVector(){
        //Iterable<Figuras> vectorf;
        Vector<Figuras> vectorf = new Vector();
        
        try {
        
            
        LinkedList ll = new LinkedList();
        
        
        entrada = new ObjectInputStream(socket.getInputStream());

        //Para recibir parametros en vez de vector figuras entero intercambiar 
        //descomentar las lineas siguientes ...   
        
        //recibe los parametros
        //ll = (LinkedList) entrada.readObject();
        //consigue el nuevo vector de figuras        
        //vectorf =  escena.setParametros(ll);
        
        // ... y comentar esta
        vectorf = (Vector<Figuras>) entrada.readObject();
        
        escena.setFigura(vectorf);

        //refresca la pantalla       
        escena.refrescar();

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } 
    
        //actualiza marcadores. a dirty way .
        
        for(Figuras f: vectorf){
         if(f.getClass().getName().equals("Modelo.Autito")){

             escena.updateMarcador((Autito) f); //actualizo el update de los 2 autitos         
         }
        }
        

}

}
